WebAssembly の概念
値
WebAssembly は 4 つの基本的な数値型のみを提供
それぞれ 32 ビット幅と 64 ビット幅
基本的な数値型に加えて、さまざまな型のパックされたデータを表す単一の 128 ビット幅のベクトル型
手順
コードは、順番に実行される一連の命令で構成される
命令は、2 つの主要なカテゴリに分類
単純命令 (Simple instructions) : データの基本的な操作を実行
オペランド スタックから引数をポップし、結果をそこにプッシュ
制御命令 (Control instructions) : 制御フローを変更
トラップ
状況によっては、特定の命令でトラップが生成されて、実行が即座に中止される場合がある
トラップは WebAssembly コードでは処理できない
外部環境に報告され、通常はそこでキャッチできる
機能
コードは個別の関数に編成される
各関数は一連の値をパラメーターとして取り、一連の値を結果として返す
関数は、再帰的を含めて相互に呼び出すことができるため、直接アクセスできない暗黙的な呼び出しスタックが発生する
関数は、仮想レジスタとして使用できる変更可能なローカル変数を宣言することもできる
テーブル
テーブルは、特定の要素タイプの不透明な値の配列
これにより、プログラムは動的インデックスオペランドを介して間接的にその値を選択できる
現在、使用可能な要素の型は、型指定されていない関数参照のみ
プログラムはテーブルへの動的インデックスを介して関数を間接的に呼び出すことができる
線形メモリ
線形メモリは、未加工バイトの連続した変更可能な配列
このようなメモリは初期サイズで作成されますが、動的に拡張できる
プログラムは、任意のバイト アドレス (未整列を含む) で、線形メモリとの間で値を読み込んだり格納したりできる
整数のロードとストアでは、それぞれの値の型のサイズよりも小さいストレージ サイズを指定できる
モジュール
モジュール/名前のペアと適切なタイプを指定して、定義をインポートすることもできる
各定義は、必要に応じて 1 つ以上の名前でエクスポートできる
定義に加えて、モジュールは、特定のオフセットにコピーされたセグメントの形式をとるメモリまたはテーブルの初期化データを定義できる
自動的に実行される開始関数を定義することもできる
エンベッダ
WebAssembly の実装は通常、ホスト環境に組み込まれる
この環境は、モジュールのロードを開始する方法、インポートを提供する方法 (ホスト側の定義を含む)、およびエクスポートにアクセスする方法を定義する
補完的な環境固有の API 定義によって提供される
セマンティックフェーズ
概念的には、WebAssembly の意味論 (セマンティクス) は 3 つのフェーズに分けられる
デコード (Decoding)
WebAssembly モジュールはバイナリ形式で配布される
デコードは、そのフォーマットを処理し、モジュールの内部表現に変換する
検証
モジュールが意味のある安全なものであることを保証するために、多くの整形式条件をチェックする
実行
実行は 2 つのフェーズに分けられる
インスタンス化 (Instantiation)
モジュールインスタンスはモジュールの動的表現であり、独自の状態と実行スタックを備えている
インスタンス化は、すべてのインポートの定義を指定して、モジュール本体自体を実行する
グローバル、メモリ、およびテーブルを初期化し、定義されている場合はモジュールの開始関数を呼び出す
モジュールのエクスポートのインスタンスを返す
呼び出し (Invocation)
インスタンス化されると、モジュールインスタンスでエクスポートされた関数を呼び出すことで、さらに WebAssembly の計算を開始できる
必要な引数を指定すると、それぞれの関数が実行され、その結果が返される
インスタンス化と呼び出しは、組み込み環境内での操作
参考文献